home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / graphics / 3dvect30.arj / FONT.ASM < prev    next >
Assembly Source File  |  1993-11-18  |  11KB  |  451 lines

  1. ; font.asm - font and cosmetic screen handling routines
  2.  
  3. ; this basically draws backgound screens/opening menus.
  4. ; have you played Red Baron or Aces of the Pacific?  It's kind of like that
  5.  
  6.            .386p
  7.            jumps
  8.  
  9. code32     segment para public use32
  10.            assume cs:code32, ds:code32, ss:code32
  11.  
  12.            include pmode.inc  ; include externals for other modules
  13.            include xmode.inc  ; just in case we ever want to use them...
  14.            include xmouse.inc
  15.            include stars.inc
  16.            include macros.inc
  17.            include 3d.inc
  18.            include equ.inc
  19.  
  20.            include font0.inc  ; font 0
  21.            include font1.inc  ; font 0
  22.            include font2.inc  ; font length tables
  23.  
  24.            public tstring
  25.            public string
  26.            public initfont
  27.  
  28.            public put_at_top
  29.            public number_eax
  30.  
  31.  
  32. ; display string of font from [esi] to zero byte
  33. ; eg db -1
  34. ;    dw x,y
  35. ;    db colour,"Hello",0
  36. ;
  37. ; commands:  -1 start new x,y,colour and text
  38. ;            -2 draw full border starting at x,y to x,y colour offset col
  39. ;            -3 fill within limits x,y  to x,y  colour offset col
  40. ;            -4 draw inside border from x,y to x,y colour offset col
  41. ;            -5 set lower case
  42. ;            -6 set upper case
  43. ;            -7 steel textured box
  44. ;            -8 repeated bitmap box
  45. ;
  46. ; fill inside full borders 3 smaller than border
  47. ; fill inside full borders 2 smaller than border to make a "lump"
  48. ; fill inside "hole" border 2 smaller than hole
  49.  
  50. newtext    equ -1
  51. border     equ -2
  52. fillarea   equ -3
  53. hole       equ -4
  54. lowercase  equ -5
  55. uppercase  equ -6
  56. steelbox   equ -7
  57. repeatbit  equ -8
  58. textend    equ 0
  59.  
  60. wcase      db 0                       ; upper/lower case add
  61. colt       dw 0
  62. linecol    dw 0
  63. tw1        dw 0
  64. tq2        dw 0
  65. sinewave   dw 0                       ; sine wave for colour
  66. ltflag     dw 0
  67. brflag     dw 0
  68. q1         dw 0
  69. w1         dw 0
  70. q2         dw 0
  71. w2         dw 0
  72.  
  73. tstring:
  74.            push esi                   ; same as string, but does
  75.            call string                ; it to both sides
  76.            call flip_page
  77.            pop esi
  78.            call string
  79.            call flip_page
  80.            ret
  81.  
  82. string:
  83.            mov wcase,0                ; default to upper case
  84.  
  85.            cld
  86.            lodsb
  87.            jmp testcommand
  88. freshtext:
  89.            lodsw
  90.            mov bx,ax                  ; x
  91.            lodsw
  92.            mov cx,ax                  ; y
  93.            mov ah,0
  94.            lodsb
  95.            mov dx,ax                  ; colour
  96. textloop:
  97.            lodsb                      ; get character/command
  98. testcommand:
  99.            cmp al,0
  100.            je txnon
  101.  
  102.            cmp al,newtext             ; -1 = 255 = set new x,y,col
  103.            je freshtext
  104.  
  105.            cmp al,border              ; -2 = outside border
  106.            jne n254
  107.            call outside
  108.            jmp textloop               ; ok, i should've used indirect jumps
  109. n254:
  110.            cmp al,fillarea            ; fine, give me a hassle, like i need it!
  111.            jne n253                   ; the code is done, i don't want to
  112.            call dofill                ; change it all now so there!
  113.            jmp textloop
  114. n253:
  115.            cmp al,hole
  116.            jne n252
  117.            call inside
  118.            jmp textloop
  119. n252:
  120.            cmp al,lowercase
  121.            jne n251
  122.            mov wcase,128
  123.            jmp textloop
  124. n251:
  125.            cmp al,uppercase
  126.            jne n250
  127.            mov wcase,0
  128.            jmp textloop
  129. n250:
  130.            cmp al,steelbox
  131.            jne n249
  132.            call steeltext
  133.            jmp textloop
  134. n249:
  135.            cmp al,repeatbit
  136.            jne n248
  137.            call dobitmapthingy
  138.            jmp textloop
  139. n248:
  140.            add al,wcase               ; include which case
  141.            pusha
  142.            char ax,bx,cx,dx
  143.            popa
  144.            movzx edi,ax
  145.            add di,di
  146.            add bx,fontlength[edi]     ; inc to next position
  147.  
  148.            jmp textloop
  149. txnon:
  150.            ret
  151.  
  152. initfont:
  153.            push offset font0          ; initialize font0 block
  154.            pushw 0
  155.            call set_display_font
  156.  
  157.            push offset font1          ; initialize font1 block
  158.            pushw 1
  159.            call set_display_font
  160.  
  161.            ret
  162.  
  163. borderd    equ 2
  164. borderm    equ 9
  165. borderl    equ 15
  166.  
  167. outside:
  168.            lodsw                      ; draw outside box, get q1,w1  q2,w2
  169.            mov q1,ax                  ; q1,w1 is top left, q2,w2 is bot right
  170.            lodsw
  171.            mov w1,ax
  172.            lodsw
  173.            mov q2,ax
  174.            lodsw
  175.            mov w2,ax
  176.            lodsw
  177.            mov colt,ax
  178.  
  179.            push esi
  180.  
  181.            mov ax,colt
  182.            add ax,borderd+1
  183.            mov linecol,ax
  184.            drawline q1,w1,q1,w2,linecol   ; now draw lines, use macros
  185.            mov ax,colt
  186.            add ax,borderm-1
  187.            mov linecol,ax
  188.            drawline q1,w1,q2,w1,linecol
  189.            mov ax,colt
  190.            add ax,borderm+1
  191.            mov linecol,ax
  192.            drawline q2,w1,q2,w2,linecol
  193.            mov ax,colt
  194.            add ax,borderd+0
  195.            mov linecol,ax
  196.            drawline q1,w2,q2,w2,linecol
  197.  
  198.            inc w1                     ; bump for middle lines
  199.            dec w2
  200.            inc q1
  201.            dec q2
  202.  
  203.            mov ax,colt                ; draw middle lines
  204.            add ax,borderl-1
  205.            mov linecol,ax
  206.            drawline q1,w1,q1,w2,linecol
  207.            mov ax,colt
  208.            add ax,borderl-2
  209.            mov linecol,ax
  210.            drawline q1,w1,q2,w1,linecol
  211.            mov ax,colt
  212.            add ax,borderl-2
  213.            mov linecol,ax
  214.            drawline q2,w1,q2,w2,linecol
  215.            mov ax,colt
  216.            add ax,borderm-1
  217.            mov linecol,ax
  218.            drawline q1,w2,q2,w2,linecol
  219.  
  220.            inc w1                     ; bump for inside lines
  221.            dec w2
  222.            inc q1
  223.            dec q2
  224.  
  225.            mov ax,colt
  226.            add ax,borderd+2
  227.            mov linecol,ax
  228.            drawline q1,w1,q1,w2,linecol   ; draw inner lines
  229.            mov ax,colt
  230.            add ax,borderd+1
  231.            mov linecol,ax
  232.            drawline q1,w1,q2,w1,linecol
  233.            mov ax,colt
  234.            add ax,borderd+0
  235.            mov linecol,ax
  236.            drawline q2,w1,q2,w2,linecol
  237.            mov ax,colt
  238.            add ax,borderl-2
  239.            mov linecol,ax
  240.            drawline q1,w2,q2,w2,linecol
  241.  
  242.            pop esi
  243.            ret
  244.  
  245. dofill:
  246.            lodsw                      ; fill box, get q1,w1  q2,w2
  247.            mov q1,ax                  ; q1,w1 is top left, q2,w2 is bot right
  248.            lodsw
  249.            mov w1,ax
  250.            lodsw
  251.            mov q2,ax
  252.            lodsw
  253.            mov w2,ax
  254.            lodsw
  255.            cmp ax,0
  256.            jne df_ncol
  257.            mov ax,background          ; if colour 0, get background colour
  258. df_ncol:
  259.            mov colt,ax
  260.  
  261.            push esi
  262.            block q1,w1,q2,w2,colt
  263.            pop esi
  264.  
  265.            ret
  266.  
  267. inside:
  268.            lodsw                      ; draw inside box, get q1,w1  q2,w2
  269.            mov q1,ax                  ; q1,w1 is top left, q2,w2 is bot right
  270.            lodsw
  271.            mov w1,ax
  272.            lodsw
  273.            mov q2,ax
  274.            lodsw
  275.            mov w2,ax
  276.            lodsw
  277.            mov colt,ax
  278.  
  279.            push esi
  280.  
  281.            mov ax,colt
  282.            add ax,borderm+1
  283.            mov linecol,ax
  284.            drawline q1,w1,q1,w2,linecol   ; now draw lines, use macros
  285.            mov ax,colt
  286.            add ax,borderd-1
  287.            mov linecol,ax
  288.            drawline q1,w1,q2,w1,linecol
  289.            mov ax,colt
  290.            add ax,borderd+1
  291.            mov linecol,ax
  292.            drawline q2,w1,q2,w2,linecol
  293.            mov ax,colt
  294.            add ax,borderm+2
  295.            mov linecol,ax
  296.            drawline q1,w2,q2,w2,linecol
  297.  
  298.            inc w1                     ; bump for inside lines
  299.            dec w2
  300.            inc q1
  301.            dec q2
  302.  
  303.            mov ax,colt
  304.            add ax,borderm+3
  305.            mov linecol,ax
  306.            drawline q1,w1,q1,w2,linecol   ; now draw lines, use macros
  307.            mov ax,colt
  308.            add ax,borderd+1
  309.            mov linecol,ax
  310.            drawline q1,w1,q2,w1,linecol
  311.            mov ax,colt
  312.            add ax,borderd+2
  313.            mov linecol,ax
  314.            drawline q2,w1,q2,w2,linecol
  315.            mov ax,colt
  316.            add ax,borderl
  317.            mov linecol,ax
  318.            drawline q1,w2,q2,w2,linecol
  319.  
  320.            pop esi
  321.            ret
  322.  
  323. simplesine dw 9,10,11,12,13,14,15,15
  324.            dw 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8
  325.  
  326. steeltext:
  327.            mov ltflag,0               ; make steel textured box (sin wave)
  328.            mov brflag,0
  329.            mov sinewave,0
  330.  
  331.            lodsw
  332.            mov q1,ax
  333.            mov q2,ax
  334.            lodsw
  335.            mov tw1,ax
  336.            lodsw
  337.            mov tq2,ax
  338.            lodsw
  339.            mov w1,ax
  340.            mov w2,ax
  341.            lodsw
  342.            mov linecol,ax
  343.            lodsw
  344.            mov colt,ax
  345. steel_loop:
  346.            mov cx,colt
  347.            add sinewave,cx
  348.            movzx edi,sinewave
  349.            shr di,8
  350.            and di,32*2-2
  351.            mov ax,simplesine[edi]
  352.            add ax,linecol
  353.            mov di,ax
  354.  
  355.            drawline q1,w1,q2,w2,di
  356.  
  357.            mov ax,ltflag
  358.            cmp ax,0
  359.            jne st_doside
  360.  
  361.            dec w1
  362.            mov ax,w1
  363.            cmp ax,tw1
  364.            jne st_dopt2
  365.  
  366.            mov ltflag,1
  367.            jmp st_dopt2
  368. st_doside:
  369.            inc q1
  370. st_dopt2:
  371.            mov ax,brflag
  372.            cmp ax,1
  373.            je st_doup
  374.  
  375.            inc q2
  376.            mov ax,q2
  377.            cmp ax,tq2
  378.            jne st_chkout
  379.  
  380.            mov brflag,1
  381. st_chkout:
  382.            mov ax,q1
  383.            cmp ax,tq2
  384.            jna steel_loop
  385.  
  386.            ret
  387. st_doup:
  388.            dec w2
  389.            jmp st_chkout
  390.  
  391. dobitmapthingy:
  392.            push esi
  393.            lodsd          ; do repeat bitmap
  394.            push eax       ; push bitmap offset (location of bitmap)
  395.            lodsw          ; get x1,y1,x2,y2
  396.            push ax
  397.            lodsw
  398.            push ax
  399.            lodsw
  400.            push ax
  401.            lodsw
  402.            push ax
  403.            call repeat_bitmap
  404.  
  405.            pop esi
  406.            add esi,2+2+2+2+4 ; add for next text instruction
  407.  
  408.            ret
  409.  
  410. number_eax dd 0
  411.  
  412. hexs       db "0123456789ABCDEF"
  413.  
  414. top_number db -3
  415.            dw 100,12,220,32,3
  416.            db -1
  417.            dw 107,20
  418.            db 13
  419.            db "EAX="
  420. number     db "00000000",0
  421.  
  422. put_at_top:
  423.            pushad
  424.            mov eax,number_eax
  425.            mov esi,7
  426.            call set_hex
  427.            call set_hex
  428.            call set_hex
  429.            call set_hex
  430.            call set_hex
  431.            call set_hex
  432.            call set_hex
  433.            call set_hex
  434.            mov esi, o top_number
  435.            call string
  436.            popad
  437.            ret
  438. set_hex:
  439.            mov di,ax
  440.            and edi,0fh
  441.            mov bl,hexs[edi]
  442.            mov number[esi],bl
  443.            shr eax,4
  444.            dec si
  445.            ret
  446.  
  447. code32     ends
  448.            end
  449.  
  450.  
  451.